class Solution {
    //竖着装填，横着读取
    public String convert(String s, int numRows) {
        //边界检查
        if (numRows == 1)
            return s;


        //声明一堆桶（桶的集合）
        List<List<Character>> buckets = new ArrayList<>();
        int i = 0;  //字符串中的字符索引
        int strLen = s.length();
        int bucketDigit = 0;    //现在是第几个桶（当前桶索引）。每次buckets.add(bucket);就会使桶数量++

        while (true) {
            List<Character> bucket = new ArrayList<>();    //声明单个桶


            //为了得到下面一行的if，我花了1小时时间。
            //0 3 6 9       0 2 4 6            0 4 8        // 当前桶索引
            //4             3                               //numRows
            //原理是根据当前桶索引,判断这次是否是完全桶。
            int remainder = bucketDigit % (numRows - 1);    //remainder 意为余数

            if (remainder == 0) {  //是完全桶
                //for (int j = i; j < i + numRows; j++) { //向每一个桶中塞入元素，每个桶中仅限塞入numRows个元素
                for (int j = 0; j < numRows; j++) { //向每一个桶中塞入元素，每个桶中仅限塞入numRows个元素
                    if (i == strLen) {   //塞入完毕，直接处理桶中元素，并return
                        break;
                    }
                    bucket.add(s.charAt(i));
                    i++;
                }
            } else { //不是完全桶，那么桶中只塞入一个元素，其它的地方全部塞入空字符。
                for (int j = 0; j < numRows; j++) { //向每一个桶中塞入元素，每个桶中仅限塞入numRows个元素
                    if (j == numRows - 1 - remainder) {   //判断条件是根据remainder只塞入符合Z字的单个元素
                        if (i == strLen) {   //塞入完毕，直接处理桶中元素，并return
                            break;
                        }
                        bucket.add(s.charAt(i));    //塞入一个非空元素
                        i++;
                    } else {
                        //即使不应该有元素，也塞入一个空字符
                        bucket.add(' ');
                    }
                }
            }

            buckets.add(bucket);    //将塞好的完全桶装入桶集合中
            bucketDigit++;



            //桶的塞入过程完毕，现在应该横向处理桶中元素了
            if (i == strLen) {

                //如果提前break，需要判断最后一个桶是不是饱和的
                List<Character> lastBucket = buckets.get(buckets.size() - 1);//得到最后一个桶
                int lastBucketSize = lastBucket.size();
                if (lastBucketSize != numRows){
                    for (int j = 0; j < numRows- lastBucketSize; j++) {
                        lastBucket.add(' ');    //塞入空字符
                    }
                }

                StringBuilder stringBuilder = new StringBuilder();
                for (int j = 0; j < numRows; j++) { //横向处理
                    for (int k = 0; k < buckets.size(); k++) {
                        /*if (buckets.get(k).size() == j + 1)  //这说明get不到j
                            continue;*/
                        stringBuilder.append(buckets.get(k).get(j));
                    }
                }
                /*StringBuilder stringBuilder = new StringBuilder();
                for(List<Character> bucket0 : buckets){
                    for (Character character : bucket0) {
                        stringBuilder.append(character);
                    }
                }*/
                return stringBuilder.toString().replaceAll(" ", "");
            }

        }
    }
}